package com.pan.common.interview.db;

/**
 * @author by panstark
 * @description
 * @notice
 * @date 2020/12/28
 */
public class DBFramework {

    /**
     * 数据库设计
     * 1、存储系统（如存数据到硬盘、固态硬盘）
     * 2、程序实例
     *    a、存储管理 （程序实例，将逻辑关系转化为存储关系）
     *    b、缓存机制（将数据放在缓存，优化访问效率）
     *    c、SQL解析模块
     *    d、日志管理（当数据出现问题，能够通过日志进行修复）
     *    e、权限划分（给不同的人看不同的数据）
     *    f、容灾机制
     *    g、索引管理
     *    h、锁管理
     */

    /**
     * 索引
     * 为什么要使用索引？
     *  索引如字典中的目录
     *
     * 什么样的信息能成为索引
     *  1、主键
     *  2、唯一键
     *
     * 索引数据结构
     *  1、二叉查找树
     *  2、B-tree
     *  3、B+-tree（主流，稳定）
     *  4、hash结构
     *  5、bitmap
     */

    /**
     * 密集索引与稀疏索引
     * 1、密集索引文件中的每个搜索码值都对应一个索引值
     * 2、稀疏索引只为索引码的某些值建立索引项
     *
     * mysql的innoDB引擎有且必须有一个密集索引
     */

    /**
     * 优化sql的步骤
     * 1、根据慢日志定位慢查询
     * 2、使用explain等工具分析sql
     * 3、修改sql或者新增索引
     */

    /**
     * 联合索引的最左匹配原则
     *  索引（A，B）
     *  where （A，B）（A）都会走索引，（B）不会走索引
     *  原因，后续索引依赖前面的索引
     */

    /**
     * mysql 的两种引擎
     * myisam：不支持行级锁，支持表级锁，不支持事务
     *     适合场景：
     *     1、频繁执行全表count操作
     *     2、对数据增删改查的频率不高，频繁查询
     *     3、没有事务
     * inndb：支持行级锁，也支持表级锁，支持事务
     *     适合场景：
     *     1、数据增删改十分频繁
     *     2、可靠性要求比较高，要求支持事务
     */

    /**
     * 数据库事务的四大特性
     * ACID
     * 1、原子性（Atomic）要么都成功，要么都失败
     * 2、一致性（Consistency） 从一个一致性，到另一个一致性。（两个账户，一个+，一个-）
     * 3、隔离性（Isolation）
     * 4、持久性（duration）
     */

    /**
     * 隔离性:
     * 1、更新丢失--mysql所有事务隔离级别目前皆可避免此种问题
     * 2、脏读--未提交读read-uncommitted，一个事务可以读到其他事务没有提交的数据
     *     解决方法：read-commited事务隔离级别可避免
     * 3、不可重复度--在同一个事务中重复读取一条数据，发现读取的结果不一致,侧重于一条数据（原因：在此事务中，其他事务修改了数据。）
     *    解决方法：将隔离级别修改为可重复度repeatable-read
     * 4、幻读--对于数据集的查询或更新，两次查询结果不一致（行级锁并不能锁住新增、删除行。），侧重于一组数据
     *    解决方法：将隔离级别设置为最高serilizable
     */

    /**
     *
     */

}
